# 任务详情
# 根据栈的结构特点，结合已提供的stack（堆栈）类代码，完成以下括号左右匹配检查的实现。

# 任务要求
# 有效括号字符串需满足：

# 1. 左括号（含英文大括号和英文小括号两种）必须用相同类型的右括号闭合

# 2. 左括号必须以正确的顺序闭合

# 3. 注意空字符串可被认为是有效字符串

# 4. 本任务考察栈的知识，请不要使用列表（list）的属性和功能

# 5. 返回数据类型为布尔类型（bool）

# 6. 所匹配的字符串包含如下：{} [] () <>，均为英文字符

# 测试用例
# 输入：'((()))'

# 输出：True

# 输入：'({())'

# 输出：False

# 输入：''

# 输出：True

# 考察点 
# 数据结构：堆栈
# 
# 
# # 1.运行或提交代码不需要自己编写测试用例，后台自动进行测试检查。
# 2.您编写代码的区域可以不限定在类或者函数体内，保证输入与输出符合任务要求即可。
# 3.点击“运行代码”按钮，可以查看程序设计是否正确，运行次数越多，任务得分越低。
# 4.点击“提交代码”按钮，系统将保存代码，并记录任务数据。
# 5.点击右上方“结束任务”按钮，系统将在后台计算任务得分，任务结束。
# -*- coding: utf-8 -*- 
class Stack:
    def __init__(self, limit=10):
        self.__stack = []
        self.limit = limit

    def push(self, data):  # 入栈操作
        if len(self.__stack) >= self.limit:
            raise IndexError('超出栈容量极限！')
        self.__stack.append(data)

    def pop(self):  # 出栈操作
        if self.__stack:
            return self.__stack.pop()
        else:
            raise IndexError('pop from an empty stack')

    def peek(self):  # 查看栈顶元素
        return self.__stack[-1] if self.__stack else None

    def size(self):  # 查看栈大小
        return len(self.__stack)

    def is_empty(self):  # 判断栈是否为空
        return False if len(self.__stack) else True


class Solution:
    def balancedParentTheses(self, str_pun: str) -> bool:
        # 从此处开始编写代码
        list1 = ['{', '[', '(', '<']
        list2 = ['}', ']', ')', '>']
        stack = Stack()
        for i in str_pun:
            if (((i == list2[0]) and (stack.peek() == list1[0])) or (
                    (i == list2[1]) and (stack.peek() == list1[1])) or (
                    (i == list2[2]) and (stack.peek() == list1[2])) or (
                    (i == list2[3]) and (stack.peek() == list1[3]))):
                stack.pop()
            else:
                stack.push(i)
        if stack.is_empty():
            return True
        else:
            return False
        # 代码编写结束


str1 = '((()))'
str2 = '({())'
str3 = ''
str4 = '([)(])'
print(Solution.balancedParentTheses(Solution, str4))
